package cxydmmszl.chapter08.t123;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StreamTokenizer;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * <li style="color: red;">Prob</li>
 * 不重复打印排序数组中相加和为给定值的所有二元组和三元组
 * <li style="color: green;">Desc</li>
 * 给定排序数组 arr 和整数 k，不重复打印 arr 中所有相加和为 k 的不降序二元组。<br/>
 * 例如, arr = [-8, -4, -3, 0, 1, 2, 4, 5, 8, 9], k = 10，
 * <br/>打印结果为：<br/>
 * 1, 9<br/>
 * 2, 8
 * <br/><br/>[要求]<br/>时间复杂度为 O(n)，空间复杂度为 O(1)
 * <br/><br/>备注：<br/>
 * &emsp;1⩽N⩽10^5<br/>
 * &emsp;-10^9⩽arr[i], k⩽10^9<br/>
 * <li style="color: green;">Input</li>
 * <li style="color: green;">Input</li>
 * 第一行有两个整数n, k；
 * 接下来一行有n个整数表示数组内的元素
 * <li style="color: green;">Output</li>
 * 输出若干行，每行两个整数表示答案；
 * 按二元组从小到大的顺序输出(二元组大小比较方式为每个依次比较二元组内每个数)
 * <li style="color: blue;">Link</li> CD3, CD4
 *
 * @author habitplus
 * @since 2021-10-08 13:42
 */
public class Main {
    static StreamTokenizer st =
            new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));

    static int nextInt() {
        try {
            st.nextToken();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return (int) st.nval;
    }

    public static void main(String[] args) {
        int n = nextInt();
        int k = nextInt();
        int[] arr = new int[n];
        for (int i = 0; i < n; i++) {
            arr[i] = nextInt();
        }

//        printUniquePair(arr, k);
        printUniqueTriad(arr, k);
//        for (int[] p : pairs) {
//            System.out.println(p[0] + " " + p[1]);
//        }
    }

    private static void printUniqueTriad(int[] arr, int k) {
        if (arr == null || arr.length < 3) {
            return;
        }
        int r = arr.length - 1;
        for (int i = 0; i < r - 1; i++) {
            if (i == 0 || arr[i] != arr[i - 1]) {
                print(arr, i + 1, r, k - arr[i]);
            }
        }
    }

    private static void print(int[] arr, int l, int r, int k) {
        int sum;
        int st = l;
        while (l < r) {
            if ((sum = arr[l] + arr[r]) > k) {
                r--;
            } else if (sum < k) {
                l++;
            } else {
                if (arr[l] != arr[l - 1]) { // 三元组内也要求严格的递增
                    System.out.println(arr[st - 1] + " " + arr[l] + " " + arr[r]);
                }
                l++;
                r--;
            }
        }
    }

    private static void printUniquePair(int[] arr, int k) {
        if (arr == null || arr.length < 2) {
            return;
        }

//        List<int[]> ans = new ArrayList<>();
        StringBuilder sb = new StringBuilder();

//        Arrays.sort(arr);

        int l = 0, r = arr.length - 1;
        int sum;
        while (l < r) {
            if ((sum = arr[l] + arr[r]) > k) {
                r--;
            } else if (sum < k) {
                l++;
            } else {
                if (l == 0 || arr[l] != arr[l - 1]) {
                    // 去掉重复的二元组
                    sb.append(arr[l]).append(" ").append(arr[r]).append("\n");
                }
                l++;
                r--;
            }
        }

        System.out.print(sb.toString());
    }
}
